package com.intelligent.system.common.utils;

import com.intelligent.system.common.exception.CustomException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

/**
 * 文件上传工具类
 */
@Slf4j
public class FileUploadUtils {
    // 允许的文件类型
    private static final List<String> ALLOWED_EXTENSIONS = Arrays.asList(
            "jpg", "jpeg", "png", "gif", "pdf", "doc", "docx", "xls", "xlsx", "txt"
    );
    
    // 最大文件大小（10MB）
    private static final long MAX_FILE_SIZE = 10 * 1024 * 1024;

    /**
     * 上传文件
     *
     * @param file 文件
     * @param uploadPath 上传路径
     * @return 文件访问路径
     */
    public static String upload(MultipartFile file, String uploadPath) {
        // 检查文件是否为空
        if (file.isEmpty()) {
            throw new CustomException("上传文件不能为空", 400);
        }

        // 检查文件大小
        if (file.getSize() > MAX_FILE_SIZE) {
            throw new CustomException("文件大小超过限制", 400);
        }

        // 获取文件扩展名
        String originalFilename = file.getOriginalFilename();
        String extension = getFileExtension(originalFilename);

        // 检查文件类型
        if (!ALLOWED_EXTENSIONS.contains(extension.toLowerCase())) {
            throw new CustomException("不支持的文件类型", 400);
        }

        // 生成新的文件名
        String newFilename = generateFilename(extension);

        try {
            // 创建上传目录
            Path uploadDir = Paths.get(uploadPath);
            if (!Files.exists(uploadDir)) {
                Files.createDirectories(uploadDir);
            }

            // 保存文件
            Path filePath = uploadDir.resolve(newFilename);
            Files.copy(file.getInputStream(), filePath);

            // 返回文件访问路径
            return newFilename;
        } catch (IOException e) {
            log.error("文件上传失败", e);
            throw new CustomException("文件上传失败: " + e.getMessage(), 500);
        }
    }

    /**
     * 删除文件
     *
     * @param filePath 文件路径
     */
    public static void delete(String filePath) {
        try {
            Path path = Paths.get(filePath);
            Files.deleteIfExists(path);
        } catch (IOException e) {
            log.error("文件删除失败", e);
            throw new CustomException("文件删除失败: " + e.getMessage(), 500);
        }
    }

    /**
     * 获取文件扩展名
     */
    private static String getFileExtension(String filename) {
        if (filename == null || filename.lastIndexOf(".") == -1) {
            throw new CustomException("无效的文件名", 400);
        }
        return filename.substring(filename.lastIndexOf(".") + 1);
    }

    /**
     * 生成新的文件名
     */
    private static String generateFilename(String extension) {
        return UUID.randomUUID().toString().replace("-", "") + "." + extension;
    }

    /**
     * 检查文件是否存在
     */
    public static boolean exists(String filePath) {
        return Files.exists(Paths.get(filePath));
    }

    /**
     * 获取文件大小
     */
    public static long getFileSize(String filePath) {
        try {
            return Files.size(Paths.get(filePath));
        } catch (IOException e) {
            log.error("获取文件大小失败", e);
            throw new CustomException("获取文件大小失败: " + e.getMessage(), 500);
        }
    }

    /**
     * 获取文件MIME类型
     */
    public static String getMimeType(String filePath) {
        try {
            return Files.probeContentType(Paths.get(filePath));
        } catch (IOException e) {
            log.error("获取文件MIME类型失败", e);
            throw new CustomException("获取文件MIME类型失败: " + e.getMessage(), 500);
        }
    }
} 